/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.media.filters
{
import flash.media.Sound;
import flash.utils.ByteArray;

/**
 * Genera dinámicamente audio de ruido transmitiéndolo en el objeto de flujo de salida.
 * @author Raohmaru
 * @version 1.0
 */
public class NoiseFilter implements IFilter
{
	/**
	 * @private
	 */
	protected var 	_blockSize: int,
					_amplitude :Number,
					_position: Number;
	private const RAN :Function = Math.random;
	
	/**
	 * Define la amplitud de onda del ruido generado.
	 */
	public function get amplitude() :Number
	{
		return _amplitude;
	}
	public function set amplitude(value :Number) : void
	{
		_amplitude = value;
	}
	
	/**
	 * Define la cantidad de muestras de sonido a extraer y escribir en el flujo dinámico de audio.
	 * Proporcione entre 2048 y 8192 muestras. Para obtener el mejor rendimiento, proporcione tantas muestras
	 * como sea posible. Cuanto menor sea el número de muestras, más probable será la aparición de interferencias
	 * en la reproducción.
	 */
	public function get blockSize(): int
	{
		return _blockSize;
	}	
	public function set blockSize( value: int ): void
	{		
		if		(value < 2048) value = 2048;
		else if (value > 8192) value = 8192;
		
		_blockSize = value;
	}
	
	/**
	 * Nuevo objeto NoiseFilter que puede añadirse a lista de filtros de un objeto SoundFX.
	 * @param amplitude Amplitud de onda del ruido generado.
	 * @param blockSize Cantidad de muestras de sonido a procesar.
	 */
	public function NoiseFilter(amplitude :Number=.25, blockSize :int=2048)
	{
		_amplitude = amplitude;
		this.blockSize = blockSize;
	}
	
	/**
	 * @inheritDoc
	 */
	public function apply( source :Sound, sample :ByteArray ) :int
	{
		var c :int = _blockSize,
			n :Number;
		while(--c > -1)
		{
			n = (RAN() -.5) * _amplitude;
	        sample.writeFloat(n);
	        sample.writeFloat(n);
	    }
	    
	    _position += _blockSize;

		return 1;
	}

	/**
	 * @inheritDoc
	 */
	public function reset( position :Number = 0.0 ) :void
	{
		_position = position;
	}
}
}